package com.hua.designpattern.creational.abstractfactory;

/**
 * 
 * @author joshua
 * 
 *         <pre>
 * 抽象工厂模式（Abstract Factory Pattern）是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
 * 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。具体的实现交给具体的工厂来处理。
 * 
 * 优点：
 * 
 * 1、抽象工厂模式隔离了具体类的生产，使得客户并不需要知道什么被创建。
 * 
 * 2、当一个产品族中的多个对象被设计成一起工作时，它能保证客户端始终只使用同一个产品族中的对象。
 * 
 * 3、增加新的具体工厂和产品族很方便，无须修改已有系统，符合“开闭原则”。
 * 
 * 
 * 
 * 缺点：
 * 
 * 1、增加新的产品等级结构很复杂，需要修改抽象工厂和所有的具体工厂类，对“开闭原则”的支持呈现倾斜性。
 * (增加具体工厂需要修改FactoryCreator)
 * 
 *  REF:
 *      Spring Bean管理
 *      
 *      
 *         </pre>
 *
 *
 *
 */
public class TestAbstractFactory {
	public static void main(String[] args) {
		AbstractFactory shapeFactory = FactoryCreator.getFactory("SHAPE");
		Shape circle = shapeFactory.getShapeBean("CIRCLE");
		circle.draw();

		Shape rectangle = shapeFactory.getShapeBean("RECTANGLE");
		rectangle.draw();

		AbstractFactory colorFactory = FactoryCreator.getFactory("COLOR");
		Color colorRed = colorFactory.getColorBean("RED");
		colorRed.fill();

		Color colorBlue = colorFactory.getColorBean("Blue");
		colorBlue.fill();
	}
}
